#include "lista.h"
#include <stdio.h>
#include <stdlib.h>

void print_test(char* name, bool result){
	printf("%s: %s\n", name, result? "OK" : "ERROR");
}

void prueba_lista(){
	
    /* Declaro las variables a utilizar */
    lista_t *milista;
    lista_iter_t *miiterador;
    int valor1,valor2,valor3,valor4,valor5,i;
    int *aux;
    valor2=25;
    
    milista = lista_crear();
    //Pruebo que se cree vacia y que no pueda borrar ni ver el primero debido a que esta vacia.
    print_test("Prueba lista: Crear lista vacia: ", milista != NULL);
    print_test("Prueba lista: error al ver primero de lista vacia: ", lista_ver_primero(milista) == NULL);
    print_test("Prueba lista: error al querer borrar de la lista vacia: ", lista_borrar_primero(milista) == NULL);
    print_test("Prueba lista: Verifico lista vacia: ", lista_esta_vacia(milista));
    print_test("Prueba lista: Verifico que la lista no tenga elementos: ", lista_largo(milista) == 0);
    // Agrego 10 elementos cualquiera a la lista
    for(i=0;i<10;i++){
		valor1=rand();
		print_test("Prueba lista: Agrego elementos: ", lista_insertar_primero(milista,&valor1));
		
	}
	// Verifico que la lista no este vacia y que contenga 10 elementos
	print_test("Prueba lista: Verifico que la lista no esta vacia: ", ! lista_esta_vacia(milista));
	print_test("Prueba lista: Verifico que la lista  tenga 10 elementos: ", lista_largo(milista) == 10);
    //Inserto un nuevo elemento al final de la lista.
	print_test("Prueba lista: Inserto un elemento al final de la lista: ",lista_insertar_ultimo(milista,&valor2));
	//Borro los primeros 10 elementos
	for(i=0;i<10;i++){
		aux=lista_ver_primero(milista);
		print_test("Prueba lista: Borro primer elemento: ", lista_borrar_primero(milista) == aux);
	}
	// Verifico que solo quede 1 elemento el ultimo que inserte.
	print_test("Prueba lista: Verifico que la lista no esta vacia: ", ! lista_esta_vacia(milista));
	print_test("Prueba lista: Verifico que la lista  tenga 1 elemento: ", lista_largo(milista) == 1);
	print_test("Prueba lista: Ver primero de lista: ", lista_ver_primero(milista) == &valor2);
	print_test("Prueba lista: Borro primer elemento: ", lista_borrar_primero(milista) == &valor2);
    //Verifico que quede vacia
    print_test("Prueba lista: Verifico lista vacia: ", lista_esta_vacia(milista));
    print_test("Prueba lista: Verifico que la lista no tenga elementos: ", lista_largo(milista) == 0);
    
    lista_destruir(milista, NULL);
    
    
    //Pruebas para las funciones con iterador
    valor1=5;
    valor2=10;
    valor3=15;
    valor4=20;
    valor5=25;
    milista = lista_crear();
    //Pruebo que se cree el iterador
    miiterador=lista_iter_crear(milista);
    print_test("Prueba iterador: Crear iterador: ", miiterador != NULL);
    print_test("Prueba iterador: Cargo la lista: ",lista_insertar(milista,miiterador,&valor3));
    print_test("Prueba iterador: Cargo la lista: ",lista_insertar(milista,miiterador,&valor2));
    print_test("Prueba iterador: Cargo la lista: ",lista_insertar(milista,miiterador,&valor1));
    print_test("Prueba iterador: Verifico que apunte al primero: ", lista_iter_ver_actual(miiterador) == &valor1);
    //Avanzo mi iterador
    print_test("Prueba iterador: Avanzo mi iterador: ", lista_iter_avanzar(miiterador));
    print_test("Prueba iterador: Verifico que apunte al segundo: ", lista_iter_ver_actual(miiterador) == &valor2);
    //Agrego un elemento en la segunda posicion
    print_test("Prueba iterador: Agrego un elemento ", lista_insertar(milista,miiterador,&valor4));
    print_test("Prueba iterador: Verifico que apunte al segundo: ", lista_iter_ver_actual(miiterador) == &valor4);
    //Verifico que mi lista tenga 4 elementos
    print_test("Prueba lista: Verifico que la lista  tenga 4 elemento: ", lista_largo(milista) == 4);
    //Avanzo mi iterador hasta el final
    print_test("Prueba iterador: Avanzo mi iterador: ", lista_iter_avanzar(miiterador));
    print_test("Prueba iterador: Avanzo mi iterador: ", lista_iter_avanzar(miiterador));
    print_test("Prueba iterador: Avanzo mi iterador: ", lista_iter_avanzar(miiterador));
    // Intento avanzar una ves mas da error.
    print_test("Prueba iterador: Avanzo mi iterador da error: ", ! lista_iter_avanzar(miiterador));
    // Inserto un elemento en la ultima posicion
    print_test("Prueba iterador: Agrego un elemento ", lista_insertar(milista,miiterador,&valor5));
    print_test("Prueba iterador: Verifico que apunte al ultimo: ", lista_iter_ver_actual(miiterador) == &valor5);
    // Verifico que no esta al final
    print_test("Prueba iterador: Verifico no este al final de la lista: ", ! lista_iter_al_final(miiterador));
    //Borro el ultimo elemento
    print_test("Prueba iterador: Borro el ultimo elemento: ", lista_borrar(milista,miiterador) == &valor5);
    // Verifico que el iterador esta al final de la lista
    print_test("Prueba iterador: Verifico que esta al final de la lista: ", lista_iter_al_final(miiterador));
    // Destruyo el iterador
    lista_iter_destruir(miiterador);
    // Borro los elementos de lalista para ver que quedaron en el orden correcto.
    print_test("Prueba lista: Borro primer elemento: ", lista_borrar_primero(milista) == &valor1);
    print_test("Prueba lista: Borro primer elemento: ", lista_borrar_primero(milista) == &valor4);
    print_test("Prueba lista: Borro primer elemento: ", lista_borrar_primero(milista) == &valor2);
    print_test("Prueba lista: Borro primer elemento: ", lista_borrar_primero(milista) == &valor3);
    print_test("Prueba lista: Verifico lista vacia: ", lista_esta_vacia(milista));
    
    lista_destruir(milista,NULL);
    
    
    
    
}

int main(void){
	prueba_lista();
	return 0;
	
}

